package it.scambiocorse.validator;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.log4j.Logger;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import it.scambiocorse.model.ServizioType;
import it.scambiocorse.utils.Costanti;
import it.scambiocorse.utils.Utils;

public class ServizioValidator implements Validator  {

	final Logger logger = Logger.getLogger(getClass());
	 
	public boolean supports(Class aClass) {
		return ServizioType.class.equals(aClass);
	}
 
	public void validate(Object obj, Errors errors) {
		
		ServizioType servizio = (ServizioType) obj;
		
		String msg = "Campo Obbligatorio";

		if (!errors.hasFieldErrors("oreFine")) {
			
		
		}
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data", "", msg);
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "veicolo", "", msg);
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "citta", "", msg);
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "ore", "", msg);
//		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "volo", "", msg);

		if (!errors.hasFieldErrors("ore")) {
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "minuti", "",msg);
		}
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "pickUp", "", msg);
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "dropOff", "", msg);
		
		
		String errCliente = "Inserire il nome del cliente";
//		if (servizio.getCliente().getIdCliente() == 0) {

		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "cliente.descNome", "", errCliente);
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "cliente.telefono", "", msg);
//		} else {
//			
//				if (errors.hasFieldErrors("cliente.descNome")) {
//					errors.rejectValue("cliente.descNome", "", errCliente);
//				}
//				if (errors.hasFieldErrors("cliente.telefono")) {
//					errors.rejectValue("cliente.telefono", "", errCliente);
//				}
//				if (errors.hasFieldErrors("cliente.email")) {
//					errors.rejectValue("cliente.email", "", errCliente);
//				}				
//				
//		}
		if (!errors.hasFieldErrors("data")) {
				if (Utils.isValidDate(servizio.getData())) {
					// Controllo che la data non sia precedente al giorno
					Timestamp dataServ = Utils.dataStringTimestamp(servizio.getData(), "dd/MM/yyyy");
					Timestamp now = Utils.dataStringTimestamp(Utils.getSysDateStr(), "dd/MM/yyyy");
					
					long data_int = dataServ.getTime();
					long now_int = now.getTime();
					// controllo se la data inserita e' precedente ad oggi
					if (data_int < now_int  ) {
						errors.rejectValue("data", "", "La data del servizio non puo' essere inferiore a oggi! ");
	
			}
			if (!errors.hasFieldErrors("ore") && !errors.hasFieldErrors("minuti")) {
							// Controllo che la data non sia precedente al giorno
							dataServ = Utils.dataStringTimestamp(servizio.getData()+" "+servizio.getOre()+servizio.getMinuti(), "dd/MM/yyyy hhmm");
							now = Utils.getSysDate(); //adesso
							
							data_int = dataServ.getTime();
							now_int = now.getTime();
							// controllo se la data inserita e' precedente ad oggi
							if (data_int < now_int  ) {
								//sembra che la data inserita sia minore di sysdate, procedo al controllo dell'ora, se ora(data_int) < di due ore di ora(now_int)
								errors.rejectValue("ore", "", "Non puoi inserire un servizio per un orario precedente a quello attuale! ");
							} else{ 
								long msDiff = data_int - now_int;
								if (msDiff < Costanti.DUE_ORE_MS) {
									errors.rejectValue("ore", "", "Per l'area PUBBLICA il servizio deve essere almeno fra 2 ore!");
								} 
							}
						} else {
							errors.rejectValue("data", "", "E' stata inserita una data formalmente sbagliata, seguire il formato 'gg/mm/aaaa' ");
						}
				}
		}
		
		if (servizio.getTipoServizio() == 0) {
			errors.rejectValue("tipoServizio", "", msg);
		} else if (servizio.getTipoServizio() == 2) {
			if (!Utils.isValid(servizio.getOreFine()) || !Utils.isValid(servizio.getMinuti())) {
				errors.rejectValue("oreFine", "", "Se hai selezionato la disposizione devi impostare un orario di fine servizio");
			}
		}
		
//		if (!errors.hasFieldErrors("oreFine")) {
//			String oraFine = servizio.getOreFine()+":"+servizio.getMinutiFine();
//			
//			String oreFine = servizio.getOreFine();
//			
//			String oreSev = servizio.getOre();
//			String minutiServ = servizio.getMinuti();
//			
//		
//		}		
		


		
		if ( ! errors.hasFieldErrors("pax")) {
			if (servizio.getPax() == 0)
					errors.rejectValue("pax", "", msg);
		}
		
		if ( ! errors.hasFieldErrors("prezzo")) {
			if (servizio.getPrezzo() == 0.0)
					errors.rejectValue("prezzo", "", msg);
		}
		if (!Utils.isValid(servizio.getPickUpToken())) {
					errors.rejectValue("pickUpToken", "", msg);
		}
		if (!Utils.isValid(servizio.getDropOffToken())) {
			errors.rejectValue("dropOffToken", "", msg);
		}
		if (servizio.getCommissione() < 1) {
			errors.rejectValue("commissione", "", msg);
		}		

		
}
}